package ar.edu.utn.frsf.tpae.a2012.g05.service.impl;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import ar.edu.utn.frsf.tpae.a2012.g05.dao.CuentaDao;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.CuentaCorriente;
import ar.edu.utn.frsf.tpae.a2012.g05.exception.NegocioException;
import ar.edu.utn.frsf.tpae.a2012.g05.service.CuentaService;

@Service
public class CuentaServiceImpl implements CuentaService {

	@Autowired @Qualifier("cuentaDaoImpl")
	private CuentaDao cuentaDao;
	
	public Cuenta saveOrUpdate(Cuenta cuenta) {
		// agregar validaciones de lógica de negocio
		cuentaDao.saveOrUpdate(cuenta);
		return cuenta;
	}

	public void delete(Cuenta cuenta) throws Exception {
		// agregar validaciones de lógica de negocio
		cuentaDao.delete(cuenta);
	}

	public Cuenta findById(Integer id) {
		// agregar validaciones de lógica de negocio
		Cuenta cuenta = cuentaDao.findById(id);
		return cuenta;
	}

	public Cuenta findByNumber(Integer number) {
		// agregar validaciones de lógica de negocio
		Cuenta cuenta = cuentaDao.findByNumber(number);
		return cuenta;
	}

	public List<Cuenta> findAll() {
		// agregar validaciones de lógica de negocio
		List<Cuenta> cuentas = cuentaDao.findAll();
		return cuentas;
	}

	public List<Cuenta> findCuentasCliente(Integer idCliente) {
		return cuentaDao.findByUserNumber(idCliente);
	}
	
	public void setCuentaDao(CuentaDao cuentaDao) {
		this.cuentaDao = cuentaDao;
	}

	@Override
	public BigDecimal getSaldo(Integer idCuenta) {
		// TODO Auto-generated method stub
		BigDecimal saldo ;
		try {
			saldo = cuentaDao.getSaldo(idCuenta);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
			return null;
		}
		return saldo;
	}

	@Override
	public void debitar(Cuenta cuenta, BigDecimal monto) throws NegocioException {

		BigDecimal minimo = new BigDecimal(0);
		
		if(cuenta instanceof CuentaCorriente) {
			BigDecimal limiteNegativo = new BigDecimal(((CuentaCorriente) cuenta).getLimiteSaldoNegativo());
			minimo = minimo.subtract(limiteNegativo);
		} 
		if (cuenta.getSaldoActual().subtract(monto).compareTo(minimo) >= 0) {
			cuentaDao.debitar(cuenta, monto);
		} else {
			throw new NegocioException("La cuenta no tiene saldo suficiente para realizar el pago."
							+ "Saldo: " + cuenta.getSaldoActual() + " - Pago: " + monto + " - Minimo: " + minimo);
		}
	}

	@Override
	public void depositar(Cuenta cuenta, BigDecimal monto)
			throws NegocioException {
		// TODO Auto-generated method stub
		
	}
}
